在我們了解了條件跟迴圈陳述式後,接下來我們要討論的是經常跟它們一起被使用的**跳躍陳述式 (Jump Statements)**了。跳躍陳述式是一些用來控制程式流程的特殊陳述式,一般不會被獨立使用,而是在使用條件或迴圈陳述式時一起使用來讓程式有更多的變化。跳躍陳述式共有四種:break 陳述式、continue 陳述式、return 陳述式跟 goto 陳述式。
break 陳述式是一種用來中斷目前正在執行的陳述式並跳到該陳述式的結束位置的陳述式。它能被使用在迴圈陳述式及 switch 陳述式中,然而,使用 break 陳述式無法中斷及結束 if 陳述式。在 switch 陳述式中,break 陳述式是用來避免程式執行當前的 case 以外的內容的結束語句。而在迴圈陳述式中,則是經常被用在使用者希望程式在還未達成原來設定的條件的情況下便停止執行迴圈內容時使用。需要注意的是,如果在巢狀架構的迴圈陳述式中使用 break 陳述式只能讓程式結束當前層數的迴圈,但不會對上一層的迴圈有影響。以下是在巢狀架構的迴圈陳述式使用 break 陳述式的例子:[Java]
public class BreakExample{
public static void main(String []args){
for (int i = 0; i < 10; i++) { // for 迴圈 1:建立變數 i 並指定它的值為 0, 檢查條件:i < 10, 當迴圈內容執行結束時執行:i++
for (int j = 0; j < 10; j++) { // for 迴圈 2:建立變數 j 並指定它的值為 0, 檢查條件:j < 10, 當迴圈內容執行結束時執行:j++
if (j > i) {
break; // 當變數 j 的值比變數 i 的值大時便跳出 for 迴圈 2,因此 i = 0 時 for 迴圈 2 只執行了一次、 i = 1 時 for 迴圈 2 只執行了兩次、如此類推...
}
System.out.print("*"); // 顯示(不換行):*
}
// 這裡是執行 break 陳述式後程式跳轉的位置
System.out.println(); // 換行
}
}
}
在以上的例子中便使用了 break 陳述式來控制每次執行 for 迴圈 1 時在換行前透過 for 迴圈 2 所列出的「*」的數量。 因此,顯示的結果為:
*
**
***
****
*****
******
*******
********
*********
**********
continue 陳述式的概念與 break 陳述式非常相似,但它不會完全中斷整個迴圈陳述式,而是中斷並跳過當前的迴圈內容,讓程式跳轉到檢查條件並決定是否繼續執行迴圈的部分。它只會被使用在迴圈陳述式中,也沒辦法對條件陳述式造成影響。同樣地,如果在巢狀架構的迴圈陳述式中使用 continue 陳述式只能讓程式跳過當前層數的迴圈內容,但不會對上一層的迴圈內容有影響。因此,它很常被使用在 for 迴圈中來選擇性的處理資料。以下是在 foreach 迴圈中使用 continue 陳述式的例子:[Python]
for num in range(100): # foreach 迴圈:從 0-99 的整數資料集合中使用每一個整數資料並暫時將其儲存在變數 num 來執行迴圈內容
if num % 2 == 0:
continue # 當變數 num 的值為雙數是跳過迴圈內容
print(num) # 顯示:變數 num 的值
以上的例子中透過使用了 continue 陳述式來讓程式只顯示 0 - 99 中的單數的值。
return 陳述式則是 break 陳述式的概念的加強版,它的目的不是中斷正在執行的陳述式而是中斷正在執行的函式 (Functions)。如果我們並不是在呼叫函式時而是在程式的主體中使用 return 陳述式的話,部分的程式 (主要是在主控台中執行的程式) 會直接結束運行,早期的 C 語言的主控台程式的結束方式便是使用 return 陳述式來控制。由於 return 陳述式通常是配合函式使用,因此詳細的使用部分會在後續討論函式時一併進行討論。
goto 陳述式是跳躍陳述式中相當罕見及特殊的一項陳述式。它的組成通常是由標籤 (Label) 與 goto 語句兩者組成的。在早期程式語言的發展尚未成熟時,它是用來執行迴圈中跳轉回到迴圈開始部分及跳出迴圈等行為的重要角色,但隨著上述不同的跳躍陳述式的出現,它便逐漸地不再被使用,一些較後期才出現的程式語言,如 Python,甚至不再提供 goto 陳述式的功能。它的使用方式是預先在程式的某部分前加入自訂名稱的標籤,並透過 goto 語句來讓程式強制跳轉到該標籤的位置並執行逐標籤下的內容。由於 goto 陳述式可以讓程式在執行時無條件地跳轉到程式的任意位置,如果頻繁地使用 goto 陳述式會使程式的執行邏輯及順序變得混亂和難以追蹤,因此一般的情況下都不建議大家使用 goto 陳述式。
以下是使用 goto 陳述式的例子:[C#]
using System;
public class GotoTest
{
public static void Main(string[] args)
{
int count = 0;
while (true) { // while 迴圈:while true 無限迴圈
if (count > 10) {
goto End; // 當變數 count 大於 10 時便讓程式跳轉到標籤 End 的位置
}
Console.WriteLine(count); // 顯示:變數 count 的值
count++;
}
End: // 標籤 End:當變數 count 大於 10 時程式會跳轉到這個位置並繼續執行下面的程式內容
Console.WriteLine("結束."); // 顯示:結束.
}
}
最後,大家一起來猜猜看執行以下的程式碼的話會發生什麼事?(請不要在電腦中進行測試!)[C#]
using System;
public class GotoLoop
{
public static void Main(string[] args)
{
Label_1:
Console.WriteLine("標籤 1");
goto Label_2;
Label_2:
Console.WriteLine("標籤 2");
goto Label_1;
Console.WriteLine("結束!");
}
}
從第二個使用 goto 陳述式的例子中,我們可以看到在使用它時很容易便會陷入在無限迴圈中,加上它有著使程式難以追蹤的特點,因此使用時必須非常小心。